Skip to content

add user deletion listeners for awards & badges #6570

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 19, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions kitsune/kbadge/handlers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from django.contrib.auth.models import User

from kitsune.kbadge.models import Award, Badge
from kitsune.users.handlers import UserDeletionListener
from kitsune.users.models import Profile


class BadgeListener(UserDeletionListener):
"""Handles badge cleanup when a user is deleted."""

def on_user_deletion(self, user: User) -> None:
sumo_bot = Profile.get_sumo_bot()
Badge.objects.filter(creator=user).update(creator=sumo_bot)


class AwardListener(UserDeletionListener):
"""Handles award cleanup when a user is deleted."""

def on_user_deletion(self, user: User) -> None:
sumo_bot = Profile.get_sumo_bot()
Award.objects.filter(creator=user).update(creator=sumo_bot)
55 changes: 55 additions & 0 deletions kitsune/kbadge/tests/test_handlers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from django.conf import settings

from kitsune.kbadge.tests import AwardFactory, BadgeFactory
from kitsune.kbadge.handlers import AwardListener, BadgeListener
from kitsune.sumo.tests import TestCase
from kitsune.users.models import Profile
from kitsune.users.tests import UserFactory


class TestAwardListener(TestCase):

def setUp(self):
self.user = UserFactory()
Profile.get_sumo_bot()
self.listener = AwardListener()

def test_award_creator_replacement(self):
award1 = AwardFactory()
award2 = AwardFactory(creator=self.user)
creator = UserFactory()
award3 = AwardFactory(creator=creator)

self.listener.on_user_deletion(self.user)

award1.refresh_from_db()
award2.refresh_from_db()
award3.refresh_from_db()

self.assertIs(award1.creator, None)
self.assertEqual(award2.creator.username, settings.SUMO_BOT_USERNAME)
self.assertEqual(award3.creator.username, creator.username)


class TestBadgeListener(TestCase):

def setUp(self):
self.user = UserFactory()
Profile.get_sumo_bot()
self.listener = BadgeListener()

def test_badge_creator_replacement(self):
badge1 = BadgeFactory()
badge2 = BadgeFactory(creator=self.user)
creator = UserFactory()
badge3 = BadgeFactory(creator=creator)

self.listener.on_user_deletion(self.user)

badge1.refresh_from_db()
badge2.refresh_from_db()
badge3.refresh_from_db()

self.assertIs(badge1.creator, None)
self.assertEqual(badge2.creator.username, settings.SUMO_BOT_USERNAME)
self.assertEqual(badge3.creator.username, creator.username)
3 changes: 3 additions & 0 deletions kitsune/users/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

from kitsune.forums.handlers import PostListener, ThreadListener
from kitsune.gallery.handlers import MediaListener
from kitsune.kbadge.handlers import AwardListener, BadgeListener
from kitsune.kbforums.handlers import PostListener as KBPostListener
from kitsune.kbforums.handlers import ThreadListener as KBThreadListener
from kitsune.messages.handlers import MessageListener
Expand Down Expand Up @@ -184,6 +185,8 @@ def delete_user_pipeline(user: User) -> None:
publisher.register_listener(DocumentListener())
publisher.register_listener(MessageListener())
publisher.register_listener(MediaListener())
publisher.register_listener(AwardListener())
publisher.register_listener(BadgeListener())

publisher.publish()
user.delete()